package com.aaa.jvmtest.methodarea;

/**
 * 二进制字节码（类基本信息、常量池、类方法定义，包含了虚拟机指令
 * 使用：javap -v 类名.class
 *
 * @author Tu
 * @date 2022/6/6 13:52
 */
public class StringTables {
    public static void main(String[] args) {
        //System.out.println("Hello World");

        //常量池中的信息，都会被加载到运行常量池中，此时 a b ab 都是常量池中的符号，还没有变为java字符串对象
        //首先会开辟一个串池，StringTable（运行常量池）,串池是Hashtable接口，不能扩容
        //其为懒惰加载，用到的时候再加载，类似缓存，先看串池有没有，有就用，没有就添加
        //例如：ldc #2 会把 a 符号变为"a"字符串对象，然后看串池有没有
        String s1 = "a";
        String s2 = "b";
        String s3 = "ab";

        //为new String，存在堆里，而s3存在串池中，二者位置不一样
        //s1 和 s2是变量，在运行时引用的值有可能修改，所以要在运行期使用Stringbulid拼接
        String s4 = s1 + s2;

        //s5 == s3；会使用串池中的已有的ab
        //javac 的编译期的优化，因为是常量不会变了，所以结果已经在编译器确定为ab.
        String s5 = "a" + "b";

    }
}
